package datos;

import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;

import control.FabricaFechas;

public abstract class Tarea {

	public static final String ABIERTA = "Abierta";
	public static final String PRUEBAS = "Pendiente pruebas";
	public static final String CERRADA = "Cerrada";
	public static final String CONGELADA = "Congelada";
	public static final String TERCEROS = "Pendiente de terceros";
	public static final String[] ESTADOS = { "", Tarea.ABIERTA, Tarea.PRUEBAS, Tarea.CERRADA, Tarea.CONGELADA, Tarea.TERCEROS };
	public static final String[] ESTADOSTREE = { Tarea.ABIERTA, Tarea.PRUEBAS, Tarea.CONGELADA, Tarea.CERRADA, Tarea.TERCEROS, "" };

	public static final int NOMBRE = 1;
	public static final int TIPO = 2;
	public static final int ENTRADAS = 3;
	public static final int DESCRIPCION = 4;
	public static final int SOLUCION = 5;
	public static final int ESTADO = 6;
	public static final int NOTAS = 7;
	public static final int FECHACIERRE = 8;
	public static final int DIRECTORIO = 9;
	public static final int PROBADORES = 10;

	protected String nombre = null;
	protected String entradas = null;
	protected String descripcion = null;
	protected String solucion = null;
	protected ControlHoras horas = null;
	protected Date fechaCreacion = null;
	protected Date fechaCierre = null;
	protected String notas = null;
	protected String directorioFicheros = null;
	protected String estado = null;
	protected List<String> probadores = null;

	public Tarea() {
		this(new Date());
	}

	public Tarea(Date fechaCreacion) {
		this.nombre = new String();
		this.entradas = new String();
		this.descripcion = new String();
		this.horas = new ControlHoras();
		this.fechaCreacion = fechaCreacion;
		this.estado = ABIERTA;
		this.probadores = new ArrayList<String>();
	}

	public abstract String getNombreTipo();

	public String getDirectorioFicheros() {
		return directorioFicheros;
	}

	public String getNotas() {
		return notas;
	}

	public String getEstado() {
		return estado;
	}

	public Date fechaCreacion() {
		return fechaCreacion;
	}

	public Date fechaCierre() {
		return fechaCierre;
	}

	public int getDiasDesdeCreacion() {
		if (estado.equals(CERRADA) && fechaCierre != null)
			return FabricaFechas.diferenciaDias(fechaCreacion, fechaCierre);
		else
			return FabricaFechas.diferenciaDias(fechaCreacion, new Date());
	}

	public List<String> getProbadores() {
		return probadores;
	}

	public String getResumenProbadores() {
		String resumen = "";
		Iterator<String> i = probadores.iterator();
		while (i.hasNext()) {
			resumen += i.next() + ", ";
		}
		if (resumen.equals(""))
			return "No hay probadores definidos para esta tarea.";
		return resumen.substring(0, resumen.length() - 2);
	}

	public String getDescripcion() {
		return descripcion;
	}

	public String getEntradas() {
		return entradas;
	}

	public String getNombre() {
		return nombre;
	}

	public String getSolucion() {
		return solucion;
	}

	public ControlHoras getControlHoras() {
		return horas;
	}

	public String toString() {
		if (nombre.length() == 0)
			return "Nueva tarea";
		return getNombre();
	}

	public boolean isActiva() {
		return !estado.equals(CERRADA);
	}

	@SuppressWarnings("unchecked")
	public void actualiza(int campo, Object valor) {
		switch (campo) {
		case NOMBRE:
			nombre = (String) valor;
			break;
		case ENTRADAS:
			entradas = (String) valor;
			break;
		case DESCRIPCION:
			descripcion = (String) valor;
			break;
		case SOLUCION:
			solucion = (String) valor;
			break;
		case ESTADO:
			String estadoAnterior = new String(estado);
			estado = (String) valor;
			if (!estadoAnterior.equals(Incidencia.CERRADA) && estado.equals(Incidencia.CERRADA))
				fechaCierre = new Date();
			break;
		case NOTAS:
			notas = (String) valor;
			break;
		case FECHACIERRE:
			fechaCierre = (Date) valor;
			break;
		case DIRECTORIO:
			directorioFicheros = (String) valor;
			break;
		case PROBADORES:
			probadores = (List<String>)valor;
			break;
		}
	}
}
